home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / getconfig.pl < prev    next >
Perl Script  |  2006-04-12  |  9KB  |  429 lines

  1. #!/usr/bin/perl
  2.  
  3. # $DHD: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.pl,v 1.13 2003/09/23 05:12:07 dawes Exp $
  4.  
  5. #
  6. # Copyright 2003 by David H. Dawes.
  7. # Copyright 2003 by X-Oz Technologies.
  8. # All rights reserved.
  9. #
  10. # Permission is hereby granted, free of charge, to any person obtaining a
  11. # copy of this software and associated documentation files (the "Software"),
  12. # to deal in the Software without restriction, including without limitation
  13. # the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14. # and/or sell copies of the Software, and to permit persons to whom the
  15. # Software is furnished to do so, subject to the following conditions:
  16. # The above copyright notice and this permission notice shall be included in
  17. # all copies or substantial portions of the Software.
  18. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  21. # THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  22. # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  23. # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. # OTHER DEALINGS IN THE SOFTWARE.
  25. # Except as contained in this notice, the name of the copyright holder(s)
  26. # and author(s) shall not be used in advertising or otherwise to promote
  27. # the sale, use or other dealings in this Software without prior written
  28. # authorization from the copyright holder(s) and author(s).
  29. # Author: David Dawes <dawes@XFree86.Org>.
  30. #
  31.  
  32.  
  33. #
  34. # This script takes PCI id information, compares it against an ordered list
  35. # of rules, and prints out the configuration information specified by the
  36. # last matching rule.
  37. #
  38. # This script is called by xf86AutoConfig().
  39. #
  40.  
  41. # Command line processing.
  42.  
  43. $GetconfigVersion = v1.0;
  44.  
  45. $debug = 0;
  46.  
  47. $myname = $0;
  48. $myname =~ s/.*\///;
  49.  
  50. $signature = "Xorg Foundation getconfig rules file.  Version: ";
  51.  
  52. while (@ARGV[0] =~ /^-[A-Za-z]$/) {
  53.     $f = shift;
  54.     SWITCH: {
  55.     if ($f eq "-D") {
  56.         $debug = 1;
  57.         last SWITCH;
  58.     }
  59.     if ($f eq "-I") {
  60.         push(@searchPaths, split(/,/, shift));
  61.         last SWITCH;
  62.     }
  63.     if ($f eq "-V") {
  64.         printf STDERR "$myname: Version %vd.\n", $GetconfigVersion;
  65.         exit 0;
  66.     }
  67.     if ($f eq "-X") {
  68.         $XorgVersionNumeric = shift;
  69.         if (!defined($XorgVersionNumeric)) {
  70.         print STDERR "$myname: -X requires the Xorg version.\n";
  71.         exit 1;
  72.         }
  73.     }
  74.     if ($f eq "-b") {
  75.         $subsys = oct(shift);
  76.         if (!defined($subsys)) {
  77.         print STDERR "$myname: -b requires the subsys id.\n";
  78.         exit 1;
  79.         }
  80.         last SWITCH;
  81.     }
  82.     if ($f eq "-c") {
  83.         $class = oct(shift);
  84.         if (!defined($class)) {
  85.         print STDERR "$myname: -c requires the class value.\n";
  86.         exit 1;
  87.         }
  88.         last SWITCH;
  89.     }
  90.     if ($f eq "-d") {
  91.         $device = oct(shift);
  92.         if (!defined($device)) {
  93.         print STDERR "$myname: -d requires the device id.\n";
  94.         exit 1;
  95.         }
  96.         last SWITCH;
  97.     }
  98.     if ($f eq "-r") {
  99.         $revision = oct(shift);
  100.         if (!defined($revision)) {
  101.         print STDERR "$myname: -r requires the device revision.\n";
  102.         exit 1;
  103.         }
  104.         last SWITCH;
  105.     }
  106.     if ($f eq "-s") {
  107.         $subsysVendor = oct(shift);
  108.         if (!defined($subsysVendor)) {
  109.         print STDERR "$myname: -s requires the subsysVendor id.\n";
  110.         exit 1;
  111.         }
  112.         last SWITCH;
  113.     }
  114.     if ($f eq "-v") {
  115.         $vendor = oct(shift);
  116.         if (!defined($vendor)) {
  117.         print STDERR "$myname: -v requires the vendor id.\n";
  118.         exit 1;
  119.         }
  120.         last SWITCH;
  121.     }
  122.     }
  123. }
  124.  
  125. printf STDERR "$myname: Version %vd.\n", $GetconfigVersion;
  126.  
  127. if (defined($XorgVersionNumeric)) {
  128.     $XorgVersionMajor = $XorgVersionNumeric / 10000000;
  129.     $XorgVersionMinor = ($XorgVersionNumeric % 10000000) / 100000;
  130.     $XorgVersionPatch = ($XorgVersionNumeric % 100000) / 1000;
  131.     $XorgVersionSnapshot = $XorgVersionNumeric % 1000;
  132.     $XorgVersion = chr($XorgVersionMajor) . chr($XorgVersionMinor) .
  133.         chr($XorgVersionPatch) . chr($XorgVersionSnapshot);
  134. }
  135.  
  136. if ($debug) {
  137.     printf STDERR "$myname: Xorg Version: %d, %d.%d.%d.%d, %vd.\n",
  138.     $XorgVersionNumeric, $XorgVersionMajor, $XorgVersionMinor,
  139.     $XorgVersionPatch, $XorgVersionSnapshot, $XorgVersion;
  140. } else {
  141.     printf STDERR "$myname: Xorg Version: %vd.\n", $XorgVersion;
  142. }
  143.   
  144.  
  145. # The rules here are just basic vendor ID to driver mappings.
  146. # Ideally this is all that would be required.  More complicated configuration
  147. # rules will be provided in external files.
  148.  
  149. # XXX This set of basic rules isn't complete yet.
  150.  
  151. @rules = (
  152.  
  153. # Set the weight for the built-in rules.
  154. ['$weight = 500'],
  155.  
  156. # APM
  157. ['$vendor == 0x1142',
  158.     'apm'],
  159.  
  160. # ARK
  161. ['$vendor == 0xedd8',
  162.     'apm'],
  163.  
  164. # ATI
  165. ['$vendor == 0x1002',
  166.     'ati'],
  167.  
  168. # Chips & Technologies
  169. ['$vendor == 0x102c',
  170.     'chips'],
  171.  
  172. # Cirrus
  173. ['$vendor == 0x1013',
  174.     'cirrus'],
  175.  
  176. # Intel
  177. ['$vendor == 0x8086',
  178.     'i810'],
  179. ['$vendor == 0x8086 && ($chipType == 0x00d1 || $chipType == 0x7800)',
  180.     'i740'],
  181.  
  182. # Matrox
  183. ['$vendor == 0x102b',
  184.     'mga'],
  185.  
  186. # Neomagic
  187. ['$vendor == 0x10c8',
  188.     'neomagic'],
  189.  
  190. # Number Nine
  191. ['$vendor == 0x105d',
  192.     'i128'],
  193.  
  194. # NVIDIA
  195. ['$vendor == 0x10de || $vendor == 0x12d2',
  196.     'nv'],
  197.  
  198. # S3
  199. ['$vendor == 0x5333 && ($device == 0x88d0 ||' .
  200.             '$device == 0x88d1 ||' .
  201.             '$device == 0x88f0 ||' .
  202.             '$device == 0x8811 ||' .
  203.             '$device == 0x8812 ||' .
  204.             '$device == 0x8814 ||' .
  205.             '$device == 0x8901)',
  206.     's3'],
  207.  
  208. # S3 virge
  209. ['$vendor == 0x5333 && ($device == 0x5631 ||' .
  210.             '$device == 0x883d ||' .
  211.             '$device == 0x8a01 ||' .
  212.             '$device == 0x8a10 ||' .
  213.             '$device == 0x8c01 ||' .
  214.             '$device == 0x8c03 ||' .
  215.             '$device == 0x8904 ||' .
  216.             '$device == 0x8a13)',
  217.     's3virge'],
  218.  
  219. # S3 Savage
  220. ['$vendor == 0x5333 && ($device >= 0x8a20 && $device <= 0x8a22 ||' .
  221.             '$device == 0x9102 ||' .
  222.             '$device >= 0x8c10 && $device <= 0x8c13 ||' .
  223.             '$device == 0x8a25 ||' .
  224.             '$device == 0x8a26 ||' .
  225.             '$device >= 0x8d01 && $device <= 0x8d04 ||' .
  226.             '$device >= 0x8c2a && $device <= 0x8c2f ||' .
  227.             '$device == 0x8c22 ||' .
  228.             '$device == 0x8c24 ||' .
  229.             '$device == 0x8c26)',
  230.     'savage'],
  231.  
  232. # SIS
  233. ['$vendor == 0x1039',
  234.     'sis'],
  235.  
  236. # SMI
  237. ['$vendor == 0x126f',
  238.     'siliconmotion'],
  239.  
  240. # 3Dfx
  241. ['$vendor == 0x121a',
  242.     'tdfx'],
  243.  
  244. # 3Dlabs
  245. ['$vendor == 0x3d3d',
  246.     'glint'],
  247.  
  248. # Trident
  249. ['$vendor == 0x1023',
  250.     'trident'],
  251.  
  252. # Tseng Labs
  253. ['$vendor == 0x100c',
  254.     'tseng'],
  255.  
  256. # VIA
  257. ['$vendor == 0x1106',
  258.     'via'],
  259.  
  260. # VMware
  261. ['$vendor == 0x15ad',
  262.     'vmware'],
  263.  
  264. );
  265.  
  266. # Reverse the search path list, since the later rules have higher priority
  267. # than earlier ones (weighting being equal).
  268.  
  269. @searchPaths = reverse(@searchPaths);
  270.  
  271. if ($debug) {
  272.     $i = 0;
  273.     for $path (@searchPaths) {
  274.     print STDERR "$myname: Search path $i is: \"$path\".\n";
  275.     $i++;
  276.     }
  277. }
  278.  
  279. print STDERR "$myname: ", $#rules + 1, " built-in rule", plural($#rules + 1),
  280.             ".\n";
  281.  
  282. for $path (@searchPaths) {
  283.     while (<$path/*.cfg>) {
  284.     @tmp = readRulesFile($_);
  285.     if (defined(@tmp[0])) {
  286.         push @rules, @tmp;
  287.     }
  288.     }
  289. }
  290.  
  291. if ($debug) {
  292.     $i = 0;
  293.     for $r (@rules) {
  294.     print STDERR "$myname: rule $i is: \'@$r\'.\n";
  295.     $i++
  296.     }
  297. }
  298.  
  299. $i = 0;
  300. $e = 0;
  301. $weight = 0;
  302. $w = 0;
  303. for $r (@rules) {
  304.     ($cond, $d, @o) = @$r;
  305.     $result = eval $cond;
  306.     if ($@) {
  307.     print STDERR "$myname: Error evaluating rule $i \'$cond\': $@";
  308.     $e++;
  309.     }
  310.     if ($debug) {
  311.     print STDERR "$myname: rule $i \'$cond\' evaluates to \'$result\'.\n";
  312.     }
  313.     if ($result && defined($d) && $weight >= $w) {
  314.     $driver = $d;
  315.     @opts = @o;
  316.     $w = $weight;
  317.     }
  318.     $i++;
  319. }
  320.  
  321. print STDERR "$myname: Evaluated $i rule", plural($i),
  322.         " with $e error", plural($e), ".\n";
  323.  
  324. print STDERR "$myname: Weight of result is $w.\n";
  325.  
  326. if ($debug) {
  327.     if (defined($driver)) {
  328.     print STDERR "$myname: Driver is \'$driver\'.\n";
  329.     } else {
  330.     print STDERR "$myname: No driver.\n";
  331.     }
  332.     if (defined(@opts)) {
  333.     print STDERR "$myname: options are:\n";
  334.     for $opt (@opts) {
  335.         print STDERR "\t$opt\n";
  336.     }
  337.     } else {
  338.     print STDERR "$myname: No options.\n";
  339.     }
  340. }
  341.  
  342. print "$driver\n";
  343. for $opt (@opts) {
  344.     print "$opt\n";
  345. }
  346.  
  347. exit 0;
  348.  
  349. # Subroutines.
  350.  
  351. sub readRulesFile {
  352.     my ($file) = @_;
  353.     my $signatureOK = 0;
  354.     my @r, @tmp;
  355.     my $line, $cont, $prevcont, $fileversion;
  356.  
  357.     undef @tmp;
  358.     undef @r;
  359.  
  360.     if (open(RF, "<$file")) {
  361.     $prevcont = 0;
  362.     while (<RF>) {
  363.         chop;
  364.         $line = $_;
  365.         next if ($line =~ /^#/);
  366.         next if ($line =~ /^\s*$/);
  367.         if (!$signatureOK) {
  368.         if ($line  =~ /^$signature(.*)$/) {
  369.             $fileversion = $1;
  370.             $signatureOK = 1;
  371.             print STDERR
  372.             "$myname: rules file \'$file\' has version $fileversion.\n";
  373.             next;
  374.         }
  375.         }
  376.         if (!$signatureOK) {
  377.         print STDERR "$myname: file \'$file\' has bad signature.\n";
  378.         close(RF);
  379.         last;
  380.         }
  381.         $cont = 0;
  382.         if ($line =~ s/\\\s*$//) {
  383.         $cont = 1;
  384.         }
  385.         if (!$prevcont && $line =~ /^\S+/) {
  386.         if (defined(@tmp[0])) {
  387.             push(@r,[@tmp]);
  388.         }
  389.         undef @tmp;
  390.         }
  391.         if ($prevcont) {
  392.         push(@tmp, pop(@tmp) . $line);
  393.         } else {
  394.         push(@tmp, $line);
  395.         }
  396.         $prevcont = $cont;
  397.     }
  398.     if (defined(@tmp[0])) {
  399.         push(@r,[@tmp]);
  400.     }
  401.     if (!defined(@r[0])) {
  402.         print STDERR "$myname: no rules in file \'$file\'.\n";
  403.     } else {
  404.         print STDERR "$myname: ", $#r + 1,
  405.             " rule", plural($#r + 1),
  406.             " added from file \'$file\'.\n";
  407.     }
  408.     } else {
  409.     print STDERR "$myname: cannot open file \'$file\'.\n";
  410.     }
  411.  
  412.     return @r;
  413. }
  414.  
  415. sub plural {
  416.     my ($count) = @_;
  417.  
  418.     if ($count != 1) {
  419.     return "s";
  420.     } else {
  421.     return "";
  422.     }
  423. }
  424.  
  425.